package kr.co.bettersoft.waitnumbercustomer.activity;

import java.util.List;

import kr.co.bettersoft.waitnumbercustomer.adapter.MemberStoreReviewListAdapter;
import kr.co.bettersoft.waitnumbercustomer.common.CommonConstant;
import kr.co.bettersoft.waitnumbercustomer.common.WaitNumberCustomerRest;
import kr.co.bettersoft.waitnumbercustomer.domain.Merchant;
import kr.co.bettersoft.waitnumbercustomer.domain.WaitingRecommendation;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
/**
 * 리뷰 리스트 전용 페이지 -> 가맹점 상세 화면에 리스트를 함께 보여주도록 함으로써, 추천하기 전용 페이지로 용도 변경
 *  --> 추천하기
 * 리스트는 보여주지 않도록 하고, 리뷰 작성란만 사용, 이미 리뷰 작성한 경우 알림창.
 *  알림창은 리뷰 등록버튼을 눌렀을때,  또는 상세화면에서 리뷰 작성 버튼 눌렀을때 - 상세화면에서 띄우도록 하기..
 * @author blue
 *
 */
public class MemberStoreReviewListActivity extends Activity {
	String TAG = "MemberStoreReviewListActivity";

	final int SELECT_DUPLICATION_RECOMMENDATION = 604;				// 가맹점 추천 여부 체크
	final int REGISTER_RECOMMENDATION = 605;						// 해당 가맹점 추천 정보 입력 + 해당 가맹점에 대한 최초 리뷰 작성 
	final int UPDATE_RECOMMENDATION = 606;							// 해당 가맹점 추천 정보 갱신 + 해당 가맹점에 대한 추가 리뷰 작성 
	
	// 폰트
	private Typeface typefaceNanumGothic= null; 
//	private Typeface typefaceNanumGothicBold = null;
	
	String userId;		// 사용자 아이디
	String merchantId;	// 전달 받은 가맹점 아이디
	String idRecommendation;	// 전달 받은 추천 테이블 인덱스
	String creator;	// 전달 받은 최초 추천자
	String companyName;	// 전달 받은 가맹점명
	String totalMember;	// 전달 받은 추천수
	String totalEvaluation;	// 전달 받은 총점
	String averageEvaluation;	// 전달 받은 평점
	
	// 설정 파일 저장소  - 사용자 전번 읽기 / 쓰기 용도	
	SharedPreferences sharedPrefCustom;
	/////////////////////////////////////////////////////////////////////////////

	// 서버 통신용
//	String certiResult="";
//	WaitNumberCustomerRest waitNumberCustomerRest;
//	String callResult = "";
//	String tempstr = "";
//	JSONObject jsonObject;

	// 중복 실행 방지용
	int isUpdating = 0;
	int dontTwice = 1;
	int isRunning = 0;

	TextView storeReviewTitle;				// 타이틀
	Button topNaviCloseBtn; 		// 상단 닫기 버튼
	
	View userRatingLayout;				// 사용자 리뷰 작성 프레임
	TextView userReviewContent;		// 사용자 리뷰 작성
	Button registerReviewBtn;		// 리뷰 등록 버튼

	// 별점
	RatingBar customerRatingBar;
	TextView reviewEvalValueView;
	// 진행바
	ProgressBar pb1;

	// 키보드 자동 숨기기 위한 부모 레이아웃(리스너 달아서 키보드 숨김)과 입력 매니저
	View parentLayout;
	InputMethodManager imm;

	
//	Merchant merchantData = new Merchant();	// 결과 저장해서 보여주기 위한 도메인.

	///////////////////////////////////////////////////////////////////////////////////////////////////	

	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			Bundle b = msg.getData();
			try{
				if(b.getInt("showAlert")==1){					 // 알림 및 경고창 . 
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		// 경고창.  
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							// 그냥 사용자 확인 용이기 때문에 추가 조작 없음.
							finish();	// 여기선 리뷰 작성이 끝났으니까 종료시켜준다.
						}})
						.setNegativeButton("", null).show();
				}
				if(b.getInt("order")==1){
					// 러닝바 실행
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 러닝바 종료
					pb1.setVisibility(View.INVISIBLE);
				}
				if(b.getInt("showErrToast")==1){
					Toast.makeText(MemberStoreReviewListActivity.this, R.string.error_message, Toast.LENGTH_SHORT).show();
				}
				if(b.getInt("showNetErrToast")==1){			
					Toast.makeText(MemberStoreReviewListActivity.this, R.string.network_error, Toast.LENGTH_SHORT).show();
				}

				switch (msg.what)
				{
				case SELECT_DUPLICATION_RECOMMENDATION  : runOnUiThread(new RunnableSelectDuplicationRecommendation());	
				break;
				case REGISTER_RECOMMENDATION  : runOnUiThread(new RunnableRegisterRecommendation());	
				break;
				case UPDATE_RECOMMENDATION  : runOnUiThread(new RunnableUpdateRecommendation());	
				break;
				default : 
					break;
				}				
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};

	//////////////////////////////////////////////////////////////////////////////////////////////////////////////

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature( Window.FEATURE_NO_TITLE );		// no title
		setContentView(R.layout.member_store_review_list_activity);

		// *** 데이터 전달 받기
		Intent gottenIntent = getIntent();
		merchantId = gottenIntent.getStringExtra("merchantId");
		idRecommendation = gottenIntent.getStringExtra("idRecommendation");
		creator = gottenIntent.getStringExtra("creator");
		companyName = gottenIntent.getStringExtra("companyName");
		totalMember = gottenIntent.getStringExtra("totalMember");
		totalEvaluation = gottenIntent.getStringExtra("totalEvaluation");
		averageEvaluation = gottenIntent.getStringExtra("averageEvaluation");
//		merchantData.setMerchantId(merchantId);
//		merchantData.setIdRecommendation(idRecommendation);
//		merchantData.setCreator(creator);
//		merchantData.setCompanyName(companyName);
//		merchantData.setEvaluationCount(totalMember);
//		merchantData.setEvaluationTotal(totalEvaluation);
//		merchantData.setEvaluationValue(averageEvaluation);
		
//		WaitNumberCustomerRest waitNumberCustomerRest = new WaitNumberCustomerRest();

//		// 가맹점 이름, 평점
		storeReviewTitle = (TextView) findViewById(R.id.store_review_title);
		storeReviewTitle.setText(companyName);	
		
		userRatingLayout = (View)findViewById(R.id.user_rating_layout);
		userRatingLayout.setVisibility(View.VISIBLE);	// 항상 보이도록 함.
		
		customerRatingBar = (RatingBar) findViewById(R.id.customer_rating_bar);
		userReviewContent = (TextView) findViewById(R.id.user_review_content);
		registerReviewBtn = (Button) findViewById(R.id.register_review_btn);
		reviewEvalValueView = (TextView) findViewById(R.id.review_eval_value);

		topNaviCloseBtn = (Button) findViewById(R.id.top_navi_close_btn);
		// 상단 닫기 버튼
		topNaviCloseBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});
		
		pb1 = (ProgressBar) findViewById(R.id.member_store_review_list_progress_bar);

		// 폰트 지정.
	    typefaceNanumGothic = Typeface.createFromAsset(getAssets(), CommonConstant.NanumGothic);  
//	    typefaceNanumGothicBold = Typeface.createFromAsset(getAssets(), CommonConstant.NanumGothicBold);
	    // 폰트 적용
	    storeReviewTitle.setTypeface(typefaceNanumGothic);
	    reviewEvalValueView.setTypeface(typefaceNanumGothic);		
	    registerReviewBtn.setTypeface(typefaceNanumGothic);		
	    
		
		merchantId = getIntent().getStringExtra("merchantId");
		// prefs
		sharedPrefCustom = getSharedPreferences(CommonConstant.prefName,
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
		userId = sharedPrefCustom.getString("qrCode", "");	
		if(userId.length()<1){
			Log.d(TAG,"no saved qrCode");
			finish();
		}

		// 부모 레이아웃 리스너 - 외부 터치 시 키보드 숨김 용도
		parentLayout = findViewById(R.id.member_store_review_parent_layout);			// 부모 레이아웃. 리스너 달아서 키보드 숨김에 사용
		parentLayout.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				hideKeyboard();
			}
		});

		registerReviewBtn.setOnClickListener(new Button.OnClickListener()  {
			public void onClick(View v)  {
					if((userReviewContent.getText()+"").length()<1){								// 리뷰 내용 없을땐 그냥 경고창? 또는 디폴트 값 사용.
						// 리뷰 내용을 작성해 주세요. 알림창을 띄우거나, 
						userReviewContent.setText(reviewEvalValueView.getText()+"");		 // 기본 값을 쓸 경우 - 좋음, 나쁨 등 자동 작성.. @@@ ###
						handler.sendEmptyMessage(SELECT_DUPLICATION_RECOMMENDATION);
					}
					else{
						handler.sendEmptyMessage(SELECT_DUPLICATION_RECOMMENDATION);
					}
			}
		});
		

		// 별점을 클릭하거나 드래그 할때 호출되는 리스너.
		customerRatingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
			@Override
			public void onRatingChanged(RatingBar ratingBar, float rating,
					boolean fromUser) {
				hideKeyboard();
				String tmpStr;
				if(rating>4){
					tmpStr = getResources().getString(R.string.veryGood);		// tmpStr = "매우 좋음";		
				}else if(rating>3){
					tmpStr = getResources().getString(R.string.good);			// tmpStr = "좋음";
				}else if(rating>2){
					tmpStr = getResources().getString(R.string.soso);			// 	tmpStr = "보통";
				}else if(rating>1){
					tmpStr = getResources().getString(R.string.bad);			// tmpStr = "나쁨";
				}else if(rating>0){
					tmpStr = getResources().getString(R.string.veryBad);		// tmpStr = "매우 나쁨";
				}else{	// 0은 없는거야
//					Log. d(TAG,"can not be 0.. get to 1"); 						// 정상동작 되는것 확인함. 
					ratingBar.setRating(1);										// 0 되면 1로 다시 올려주기.
					tmpStr = getResources().getString(R.string.veryBad);		// tmpStr = "매우 나쁨";
				}
				//				reviewEvalValueView.setText("Now Rating : " + rating);
				reviewEvalValueView.setText(tmpStr);
			}
		});
	}

	///////////////////////////////////////////////////////////////////////////////////////////////////////////	

	
	
	/**
	 * 러너블. 가맹점 추천테이블에 해당 가맹점이 있는지 확인한다 		// SELECT_MERCHANT_RECOMMENDATION_LIST  selectMerchantRecommendationList
	 */
	class RunnableSelectDuplicationRecommendation implements Runnable {
		public void run(){
			new backgroundSelectDuplicationRecommendation().execute();
		}
	}
	/**
	 * backgroundSelectDuplicationRecommendation
	 *  비동기로  가맹점 추천테이블에 해당 가맹점이 있는지 확인한다 	
	 *
	 * @param
	 * @param
	 * @return
	 */
	public class backgroundSelectDuplicationRecommendation extends   AsyncTask<Void, Void, Void> {
		@Override protected void onPostExecute(Void result) { 
		}
		@Override protected void onPreExecute() { 
		}
		@Override protected Void doInBackground(Void... params) { 
			Log. d(TAG,"backgroundSelectDuplicationRecommendation");
			
			//			// 파리미터 세팅
			WaitingRecommendation waitingRecommendationParam = new WaitingRecommendation();
			waitingRecommendationParam.setMerchantId(merchantId);
			// 호출
			// if(!pullDownRefreshIng){
			showPb();
			// }
			WaitNumberCustomerRest waitNumberCustomerRest = new WaitNumberCustomerRest();
			String callResult = waitNumberCustomerRest.RestSelectDuplicationRecommendation(waitingRecommendationParam);		
			hidePb();
			isRunning = 0;
			Log.d(TAG,"callResult::"+callResult);
			//			// 결과 처리		 
			if(callResult.equals("S")){ //  성공, 0		//  || callResult.equals("D")
				// 최초 등록
				handler.sendEmptyMessage(REGISTER_RECOMMENDATION);
			}else if(callResult.equals("D")){
				// 업뎃 (최초 등록 아님)
				handler.sendEmptyMessage(UPDATE_RECOMMENDATION);
			}else{
				// 에러
				showMSG();
			}
			return null ;
		}
	}

	/**
	 * 러너블. 해당 가맹점에 대한 추천 점수 생성, 및 최초 리뷰 등록한다.
	 */
	class RunnableRegisterRecommendation implements Runnable {
		public void run(){
			new backgroundRegisterRecommendation().execute();
		}
	}
	/**
	 * backgroundRegisterRecommendation
	 *  비동기로 해당 가맹점에 대한 추천 점수 생성, 및 최초 리뷰 등록한다.
	 *
	 * @param
	 * @param
	 * @return
	 */
	public class backgroundRegisterRecommendation extends   AsyncTask<Void, Void, Void> {
		@Override protected void onPostExecute(Void result) { 
		}
		@Override protected void onPreExecute() { 
		}
		@Override protected Void doInBackground(Void... params) { 
			Log. d(TAG,"backgroundRegisterRecommendation");

			//				// 파리미터 세팅
			WaitingRecommendation waitingRecommendationParam = new WaitingRecommendation();
			Merchant merchantParam = new Merchant();
			waitingRecommendationParam.setMerchantId(merchantId);
			waitingRecommendationParam.setMemberId(userId);
			waitingRecommendationParam.setEvaluation(((int)customerRatingBar.getRating()*2)+"");
			waitingRecommendationParam.setContent(userReviewContent.getText()+"");
			
			// 초기값
			merchantParam.setEvaluationCount("1");
			merchantParam.setEvaluationTotal(((int)customerRatingBar.getRating()*2)+"");
			merchantParam.setEvaluationValue(((int)customerRatingBar.getRating()*2)+"");
			
			
			// 호출
			showPb();
			WaitNumberCustomerRest waitNumberCustomerRest = new WaitNumberCustomerRest();
			String callResult = waitNumberCustomerRest.RestRegisterRecommendation(waitingRecommendationParam, merchantParam);	
			hidePb();
			isRunning = 0;
			//				// 결과 처리		// 20170718-17:44 현재 받은 데이터 없음. 공백..
			if(!(callResult.equals("F"))){ //  성공

				try {
					JSONObject jsonObject = new JSONObject(callResult);
					String strResult = jsonObject.getString("result").toString(); 
					if((strResult.equals("SUCCESS"))){
						showResultDialog(getResources().getString(R.string.reviewRegistered)); // showResultDialog("리뷰를 등록하였습니다.");
					}
				} catch (JSONException e) {
					e.printStackTrace();
				} 
				
				
			}else{ 					//  실패
				showMSG();
			}
			return null ;
		}
	}
	
	/**
	 * 러너블. 해당 가맹점에 대한 추천 점수 갱신, 및 리뷰 추가 등록한다.
	 */
	class RunnableUpdateRecommendation implements Runnable {
		public void run(){
			new backgroundUpdateRecommendation().execute();
		}
	}
	/**
	 * backgroundUpdateRecommendation
	 *  비동기로 해당 가맹점에 대한 추천 점수 갱신, 및 리뷰 추가 등록한다.
	 *
	 * @param
	 * @param
	 * @return
	 */
	public class backgroundUpdateRecommendation extends   AsyncTask<Void, Void, Void> {
		@Override protected void onPostExecute(Void result) { 
		}
		@Override protected void onPreExecute() { 
		}
		@Override protected Void doInBackground(Void... params) { 
			Log. d(TAG,"backgroundUpdateRecommendation");

			//				// 파리미터 세팅
			WaitingRecommendation waitingRecommendationParam = new WaitingRecommendation();
			waitingRecommendationParam.setMerchantId(merchantId);
			waitingRecommendationParam.setMemberId(userId);
			waitingRecommendationParam.setEvaluation(((int)customerRatingBar.getRating()*2)+"");
			waitingRecommendationParam.setContent(userReviewContent.getText()+"");
			// 호출
			showPb();
			WaitNumberCustomerRest waitNumberCustomerRest = new WaitNumberCustomerRest();
			String callResult = waitNumberCustomerRest.RestUpdateRecommendation(waitingRecommendationParam);
			hidePb();
			isRunning = 0;
			//				// 결과 처리		 
			if(callResult.equals("S")){ //  성공
				showResultDialog(getResources().getString(R.string.reviewRegistered));	// showResultDialog("리뷰를 등록하였습니다.");
			}else{ 					//  실패
			}
			
			return null ;
		}
	}
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////


	// 키보드를 숨긴다.
	public void hideKeyboard(){
		imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
		imm .hideSoftInputFromWindow(userReviewContent.getWindowToken(), 0);
	}

	/**
	 * returnThis
	 *  컨택스트를 리턴한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public Context returnThis(){
		return this;
	}
	
	/**
	 * showResultDialog
	 * 얼럿창을 띄운다
	 *
	 * @param msg
	 * @param 
	 * @return 
	 */
	public void showResultDialog(final String msg){
		MemberStoreReviewListActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showAlert", 1);
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	
	
	// 진행바 보임 / 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("order", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("order", 2);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * showMSG
	 *  화면에 error 토스트 띄운다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showMSG(){			// 화면에 토스트 띄움..
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showErrToast", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}

	/////////////////////////////////////////////////////////////////////////////////////////////////////////	

}
